#pragma once
#include <iostream>
#include <string>

// 定义可用的运算符集合
std::string opers="+-*/%";

// 定义错误码枚举
enum {
    DivZero=1,    // 除零错误
    ModZero,      // 取模零错误
    Unknown       // 未知错误
};

// Task类：表示一个计算任务
class Task
{
public:
    // 默认构造函数
    Task()
    {}

    // 带参数的构造函数
    // x, y: 运算数, op: 运算符
    Task(int x, int y, char op) 
        : data1_(x),      // 第一个操作数
          data2_(y),      // 第二个操作数
          oper_(op),      // 运算符
          result_(0),     // 初始化结果为0
          exitcode_(0)    // 初始化错误码为0
    {
    }

    // 执行计算任务的核心函数
    void run()
    {
        switch (oper_)
        {
        case '+':    // 加法
            result_ = data1_ + data2_;
            break;
        case '-':    // 减法
            result_ = data1_ - data2_;
            break;
        case '*':    // 乘法
            result_ = data1_ * data2_;
            break;
        case '/':    // 除法
            {
                if(data2_ == 0) exitcode_ = DivZero;  // 检查除数是否为0
                else result_ = data1_ / data2_;
            }
            break;
        case '%':    // 取模
           {
                if(data2_ == 0) exitcode_ = ModZero;  // 检查除数是否为0
                else result_ = data1_ % data2_;
            }            
            break;
        default:     // 未知运算符
            exitcode_ = Unknown;
            break;
        }
    }

    // 重载()运算符，使对象可以像函数一样被调用
    void operator ()()
    {
        run();
    }

    // 获取计算结果的字符串表示
    // 格式：数字1 运算符 数字2 = 结果 [错误码]
    std::string GetResult()
    {
        std::string r = std::to_string(data1_);
        r += oper_;
        r += std::to_string(data2_);
        r += "=";
        r += std::to_string(result_);
        r += "[code: ";
        r += std::to_string(exitcode_);
        r += "]";

        return r;
    }

    // 获取任务的字符串表示
    // 格式：数字1 运算符 数字2 =?
    std::string GetTask()
    {
        std::string r = std::to_string(data1_);
        r += oper_;
        r += std::to_string(data2_);
        r += "=?";
        return r;
    }

    // 析构函数
    ~Task()
    {
    }

private:
    int data1_;     // 第一个操作数
    int data2_;     // 第二个操作数
    char oper_;     // 运算符

    int result_;    // 计算结果
    int exitcode_;  // 错误码
};